package utility;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Vector;

import core.Cono;
import core.ConoList;
/**
 * @class Gestisce tutte le posssibili combinazioni per poter poi ricavare gli mhs.
 * @author   Giovanni Richini
 * @author   Andrea Inserra
 * @author   Marco Pedersoli
 * @version   1.0
 */

public class Permutazioni {
   
   public <T> ArrayList<ConoList> combinazioni(ConoList linearSet){
	   ArrayList<ConoList> risultato=new  ArrayList <ConoList>();
	   for(int i=1; i<linearSet.size()+1;i++){
		   risultato.addAll((Collection<? extends ConoList>) getSubsets(linearSet, i));
	   }	   	
	   return risultato;
   }
   
   public static<T> List<ConoList> getSubsets(ConoList linearSet, int k) { 
       
       if (linearSet == null || k > linearSet.size() || k < 0) 
           throw new IllegalArgumentException("WTF are you asking for?"); 
        
       List<ConoList> toReturn = new ArrayList<ConoList>(); 
 
       if (k == 0) return toReturn; 

       int[] indexes = new int[k]; 
       indexes[0] = 0; 
        
       int i = 0; 
        
       while (i >= 0) { 
           while (i++ < indexes.length - 1) 
               indexes[i] = indexes[i-1]+1; 

           ConoList toAdd = new ConoList(); 
           for (i = 0; i < k; i++) 
               toAdd.add(linearSet.get(indexes[i])); 
           toReturn.add(toAdd); 
            
           i = indexes.length - 1; 
            
           while (i >= 0 && ++indexes[i] == linearSet.size() - (indexes.length-i-1)) 
               i--; 
       } 
       return toReturn; 
   } 
   
}